<?php
/**
 * Laconica, the distributed open-source microblogging tool
 *
 * Settings for Jabber/XMPP integration
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Settings
 * @package   Laconica
 * @author    Evan Prodromou <evan@controlyourself.ca>
 * @copyright 2008-2009 Control Yourself, Inc.
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link      http://laconi.ca/
 */

if (!defined('LACONICA')) {
    exit(1);
}

require_once INSTALLDIR.'/lib/connectsettingsaction.php';
require_once INSTALLDIR.'/lib/jabber.php';
require_once INSTALLDIR.'/lib/imbothandle.php';

/**
 * Settings for Jabber/XMPP integration
 *
 * @category Settings
 * @package  Laconica
 * @author   Evan Prodromou <evan@controlyourself.ca>
 * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
 * @link     http://laconi.ca/
 *
 * @see      SettingsAction
 */

class ImsettingsAction extends ConnectSettingsAction
{
    /**
     * Title of the page
     *
     * @return string Title of the page
     */

    function title()
    {
        return _('IM Settings');
    }

    /**
     * Instructions for use
     *
     * @return instructions for use
     */

    function getInstructions()
    {
        return _('Bạn có thể cập nhật tin nhanh bằng các chương trình  '.
                 'chat Yahoo messenger/GTalk tại đây.<br />  '.
                 '<b>Lưu ý</b>: Bạn nên thêm bot của Tôi24h vào danh sách bạn bè của bạn <br />.'.
                 '<b>Y/M</b> : <font color="red">toi24h@yahoo.com</font> và <b>GTalk</b>: <font color="red">toi24h@bot.im</font>');
    }

    /**
     * Content area of the page
     *
     * We make different sections of the form for the different kinds of
     * functions, and have submit buttons with different names. These
     * are muxed by handlePost() to see what the user really wants to do.
     *
     * @return void
     */

    function showContent()
    {
        $user = common_current_user();
        $this->elementStart('form', array('method' => 'post',
                                          'id' => 'form_settings_im',
                                          'class' => 'form_settings',
                                          'action' =>
                                          common_local_url('imsettings')));
        $this->elementStart('fieldset', array('id' => 'settings_im_address'));
        $this->element('legend', null, _('Address'));
        $this->hidden('token', common_session_token());

        if ($user->jabber) {
            $this->element('p', 'form_confirmed', $user->jabber);
            $this->element('p', 'form_note',
                           _('Địa chỉ IM đã được xác nhận.'));
            $this->hidden('jabber', $user->jabber);
            $this->submit('remove', _('Remove'));
        } else {
            $confirm = $this->getConfirmation();
            if ($confirm) {
                $this->element('p', 'form_unconfirmed', $confirm->address);
                $this->element('p', 'form_note',
                               sprintf(_('Đang đợi xác nhận địa chỉ này. Bạn hãy kiểm tra địa chỉ IM chat của bạn để nhận mã xác nhận của địa chỉ này.(Bạn đã thêm bot của Tôi24h vào danh sách bạn bè chưa?)'),
                                       jabber_daemon_address()));
                $this->hidden('jabber', $confirm->address);
                $this->submit('cancel', _('Cancel'));
            } else {
                $this->elementStart('ul', 'form_data');
                $this->elementStart('li');
                $this->input('jabber', _('IM Address'),
                             ($this->arg('jabber')) ? $this->arg('jabber') : null,
                             sprintf(_('Địa chỉ YM hoặc GTalk của bạn, '.
                                       'ví dụ "abc123@yahoo.com". ')));
                $this->elementEnd('li');
                $this->elementStart('li');
                $this->input('im_userkey', _('User key'),
                             ($this->arg('im_userkey')) ? $this->arg('im_userkey') : null,
                             sprintf(_('Mã xác nhận User Key. Để có mã xác nhận này, bạn chỉ cần chat với bot của Tôi24h với nội dung "userkey". Bạn sẽ nhận được trả lời với mã User key của bạn.Lưu ý : Mỗi user key chỉ tương ứng với với một địa chỉ IM duy nhất - Bạn nên sử dụng địa chỉ IM ở ô trên để chat với bot.')));
                $this->elementEnd('li');
                $this->elementEnd('ul');
                $this->submit('add', _('Add'));
            }
        }
        $this->elementEnd('fieldset');
        
        $this->elementStart('fieldset', array('id' => 'settings_im_preferences'));
        $this->element('legend', null, _('Tuỳ chọn'));
        $this->elementStart('ul', 'form_data');
        $this->elementStart('li');
        $this->checkbox('jabbernotify',
                        _('Gởi tôi tin nhắn thông qua IM.'),
                        $user->jabbernotify);
        $this->elementEnd('li');
/*        $this->elementStart('li');
        $this->checkbox('updatefrompresence',
                        _('Post a notice when my Jabber/GTalk status changes.'),
                        $user->updatefrompresence);
        $this->elementEnd('li');*/
        $this->elementStart('li');
        $this->checkbox('jabberreplies',
                        _('Gởi tôi những trả lời thông qua IM  '.
                          'từ những thành viên tôi không theo đuôi..'),
                        $user->jabberreplies);
        $this->elementEnd('li');
/*        $this->elementStart('li');
        $this->checkbox('jabbermicroid',
                        _('Publish a MicroID for my Jabber/GTalk address.'),
                        $user->jabbermicroid);
        $this->elementEnd('li');*/
        $this->elementEnd('ul');
        $this->submit('save', _('Save'));
        $this->elementEnd('fieldset');
        $this->elementEnd('form');
    }

    /**
     * Get a confirmation code for this user
     *
     * @return Confirm_address address object for this user
     */

    function getConfirmation()
    {
        $user = common_current_user();

        $confirm = new Confirm_address();

        $confirm->user_id      = $user->id;
        $confirm->address_type = 'jabber';

        if ($confirm->find(true)) {
            return $confirm;
        } else {
            return null;
        }
    }

    /**
     * Handle posts to this form
     *
     * Based on the button that was pressed, muxes out to other functions
     * to do the actual task requested.
     *
     * All sub-functions reload the form with a message -- success or failure.
     *
     * @return void
     */

    function handlePost()
    {
        // CSRF protection
        $token = $this->trimmed('token');
        if (!$token || $token != common_session_token()) {
            $this->showForm(_('There was a problem with your session token. '.
                              'Try again, please.'));
            return;
        }

        if ($this->arg('save')) {
            $this->savePreferences();
        } else if ($this->arg('add')) {
            $this->addAddress();
        } else if ($this->arg('cancel')) {
            $this->cancelConfirmation();
        } else if ($this->arg('remove')) {
            $this->removeAddress();
        } else {
            $this->showForm(_('Unexpected form submission.'));
        }
    }

    /**
     * Save user's Jabber preferences
     *
     * These are the checkboxes at the bottom of the page. They're used to
     * set different settings
     *
     * @return void
     */

    function savePreferences()
    {

        $jabbernotify       = $this->boolean('jabbernotify');
       // $updatefrompresence = $this->boolean('updatefrompresence');
        $updatefrompresence = 0;
        $jabberreplies      = $this->boolean('jabberreplies');
        $jabbermicroid      = 1;

        $user = common_current_user();

        assert(!is_null($user)); // should already be checked

        $user->query('BEGIN');

        $original = clone($user);

        $user->jabbernotify       = $jabbernotify;
        $user->updatefrompresence = $updatefrompresence;
        $user->jabberreplies      = $jabberreplies;
        $user->jabbermicroid      = $jabbermicroid;

        $result = $user->update($original);

        if ($result === false) {
            common_log_db_error($user, 'UPDATE', __FILE__);
            $this->serverError(_('Couldn\'t update user.'));
            return;
        }

        $user->query('COMMIT');

        $this->showForm(_('Preferences saved.'), true);
    }

    /**
     * Sends a confirmation to the address given
     *
     * Stores a confirmation record and sends out a
     * Jabber message with the confirmation info.
     *
     * @return void
     */
     
     

    function addAddress()
    {
        $user = common_current_user();

        $jabber = $this->trimmed('jabber');
        $user_key =$this->trimmed('im_userkey');

        // Some validation

        if (!$jabber) {
            $this->showForm(_('No Jabber ID.'));
            return;
        }

        if (!$user_key) {
            $this->showForm(_('Bạn chưa nhập User key.'));
            return;
        }
        
        $jabber = jabber_normalize_jid($jabber);

        if (!$jabber) {
            $this->showForm(_('Cannot normalize that Jabber ID'));
            return;
        }
        if (!jabber_valid_base_jid($jabber)) {
            $this->showForm(_('Không phải địa chỉ IM hợp lệ'));
            return;
        } else if ($user->jabber == $jabber) {
            $this->showForm(_('Địa chỉ IM này hiện đang được bạn sử dụng.'));
            return;
        } else if ($this->jabberExists($jabber)) {
            $this->showForm(_('Địa chỉ IM này đã tồn tại và thuộc một thành viên khác.'));
            return;
        } else if ($this->userkeyExists($user_key)) {
            $this->showForm(_('User key này đã tồn tại và thuộc một thành viên khác.'));
            return;
        }

        $confirm = new Confirm_address();

        $confirm->address      = $jabber;
        $confirm->address_type = 'jabber';
        $confirm->user_id      = $user->id;
        $confirm->im_userkey =  $user_key;
        $confirm->code         = common_confirmation_code(64);

        $result = $confirm->insert();

        if ($result === false) {
            common_log_db_error($confirm, 'INSERT', __FILE__);
            $this->serverError(_('Couldn\'t insert confirmation code.'));
            return;
        }

/*        if (!common_config('queue', 'enabled')) {
            jabber_confirm_address($confirm->code,
                                   $user->nickname,
                                   $jabber);
        }*/
        
        $result_send=$this->send_confirm_imbot($user_key, $confirm->code,$user->nickname);
        if($result_send==false)
        {
            $this->showForm(_('Có lỗi xảy ra khi gởi mã xác nhận đến địa chỉ IM của bạn - 1.'));
            return;
        }
        else if(Imbot_Handle::checkFail($result_send))
        {
            $this->showForm(_('Có lỗi xảy ra khi gởi mã xác nhận đến địa chỉ IM của bạn - 2.'));
            return;
        }

        $msg = sprintf(_('Mã xác nhận đã được gởi tới địa chỉ IM của bạn ở trên. Bạn cần xác nhận địa chỉ của bạn một lần nữa để bắt đầu sử dụng tính năng này. Lưu ý: Bạn cần cho phép bot của Tôi24h gởi tin nhắn qua IM cho bạn.'));

        $this->showForm($msg, true);
    }

    /**
     * Cancel a confirmation
     *
     * If a confirmation exists, cancel it.
     *
     * @return void
     */

    function cancelConfirmation()
    {
        $jabber = $this->arg('jabber');

        $confirm = $this->getConfirmation();

        if (!$confirm) {
            $this->showForm(_('No pending confirmation to cancel.'));
            return;
        }
        if ($confirm->address != $jabber) {
            $this->showForm(_('That is the wrong IM address.'));
            return;
        }

        $result = $confirm->delete();

        if (!$result) {
            common_log_db_error($confirm, 'DELETE', __FILE__);
            $this->serverError(_('Couldn\'t delete email confirmation.'));
            return;
        }

        $this->showForm(_('Confirmation cancelled.'), true);
    }

    /**
     * Remove an address
     *
     * If the user has a confirmed address, remove it.
     *
     * @return void
     */

    function removeAddress()
    {
        $user = common_current_user();

        $jabber = $this->arg('jabber');

        // Maybe an old tab open...?

        if ($user->jabber != $jabber) {
            $this->showForm(_('That is not your Jabber ID.'));
            return;
        }

        $user->query('BEGIN');

        $original = clone($user);

        $user->jabber = null;

        $result = $user->updateKeys($original);

        if (!$result) {
            common_log_db_error($user, 'UPDATE', __FILE__);
            $this->serverError(_('Couldn\'t update user.'));
            return;
        }
        $user->query('COMMIT');

        // XXX: unsubscribe to the old address

        $this->showForm(_('The address was removed.'), true);
    }

    /**
     * Does this Jabber ID exist?
     *
     * Checks if we already have another user with this address.
     *
     * @param string $jabber Address to check
     *
     * @return boolean whether the Jabber ID exists
     */

    function jabberExists($jabber)
    {
        $user = common_current_user();

        $other = User::staticGet('jabber', $jabber);

        if (!$other) {
            return false;
        } else {
            return $other->id != $user->id;
        }
    }
    
    function userkeyExists($userkey)
    {
        $user = common_current_user();

        $other = User::staticGet('im_userkey', $userkey);

        if (!$other) {
            return false;
        } else {
            return $other->id != $user->id;
        }
    }
    
    function imbot_normalize_jid($jid)
    {
        if (preg_match("/(?:([^\@]+)\@)?([^\/]+)(?:\/(.*))?$/", $jid, $matches)) {
            $node   = $matches[1];
            $server = $matches[2];
            return strtolower($node.'@'.$server);
        } else {
            return null;
        }
    }
    
    function send_confirm_imbot($user_key,$code,$nickname)
    {

/*        $msg_confirm='Thành viên : "' . $nickname . '" tại ' . common_config('site', 'name') . ' ' .
      'vừa thông báo địa chỉ IM này thuộc về họ. ' .
      'Nếu đúng là bạn, bạn có thể xác nhận bằng việc bấm vào mã xác nhận dưới đây: ' .
      common_local_url('confirmaddress', array('code' => $code)) .
      ' . (Nếu bạn không bấm được, cắt-và-dán địa chỉ vào ' .
      'thanh địa chỉ của trình duyêth Web). Nếu bạn không phải là thành viên này, hoặc bạn không yêu cầu mã xác nhận này, bạn hãy tắt cửa sổ hội thoại này. Xin chân thành cảm ơn bạn.';*/
        $msg_confirm='Thanh vien : ' . $nickname . ' tai Toi24h.com'. ' ' .
      'vua thong bao dia chi IM nay thuoc ve ho. ' .
      'Neu dung la ban, ban co the xac nhan bang viec bam vao ma xac nhan duoi day: ' .
      common_local_url('confirmaddress', array('code' => $code)) .
      ' . (Neu ban khong bam duoc, copy-va-paste dia chi vao ' .
      'thanh dia chi cua trinh duyet Web). Neu ban khong phai la thanh vien nay, hoac ban khong yeu cau ma xac nhan nay, ban hay tat cua so hoi thoai nay. Xin chan thanh cam on ban.';
        $bot = new Imbot_Handle();
        return $bot->sendMessage($user_key, $msg_confirm);
    }
}
